2019年1月27日
Jerry
8658
2019年6月22日
itchat提供了一个简单的注册函数,可以时刻检测微信收到的各种消息(文本、音频、视频、图片、群消息、私聊消息等),可以用来包装自动回复。
def msg_register(self, msgType, isFriendChat=False, isGroupChat=False, isMpChat=False):
raise NotImplementedError()
isFriendChat、isGroupChat、isMpChat 分别是私聊消息标记、群组消息标记和公众号消息标记。msgType消息类型有如下几种:
参数 类型
TEXT 文本
MAP 地图
CARD 名片
SHARING 分享
PICTURE 图片
RECODRDING 录音
ATTACHMENT 附件
VIDEO 视频
FRIENDS 朋友添加申请
SYSTEM 系统消息
NOTE 通知
1、自动回复私聊消息
包装以下函数,可以用于私聊消息的检测与回复:
# 检测来自私聊的文本类型、录音类型、图片类型的消息
@itchat.msg_register([TEXT, RECORDING, PICTURE], isFriendChat=True)
def reply_friend(msg):
#print(msg, flush=True)
global g_autoReplyFriend
if msg['Type'] == "Text": #文本消息,直接获取内容
msg_content = msg['Text']
elif msg['Type'] == "Recording" or msg['Type'] == "Picture": #录音和图片
msg_content = msg['FileName']
msg['Text'](str(msg_content)) #下载文件
if g_autoReplyFriend == True: #回复标记位 Ture 则自动回复
itchat.send_msg('[自动回复]: 你的消息已收到!', toUserName = msg['FromUserName'])
logging("收到[%s]的[%s]消息[%s],已经自动回复!" %(msg['User']['NickName'], msg['Type'], msg_content))
2、自动回复群@消息
群消息的检测类似,只不过参数为 isGroupChat=True ,msg.isAt 可以判断是否@了自己:
# 检测来自群组的文本类型的消息
@itchat.msg_register(TEXT, isGroupChat=True)
def reply_group(msg):
#print(msg, flush=True)
global g_autoReplyGroup
if g_autoReplyGroup == True:
if (msg.isAt): #只处理 @我 的消息
msg_content = msg['Content'].split("\u2005", 1)[1] # 文字分割,获取@我 之后的消息内容
itchat.send_msg('[自动回复]: 你的消息已收到!', toUserName = msg['FromUserName'])
3、自动添加好友
自动加好友的函数,收到的消息类型为 FRIENDS
# 检测加好友的消息通知
@itchat.msg_register([FRIENDS])
def add_friend(msg):
#print(msg, flush=True)
global g_autoAddFriend
if g_autoAddFriend == True:
itchat.add_friend(**msg['Text'])
itchat.send_msg('你好!很高兴认识你!', msg['RecommendInfo']['UserName'])
logging("收到[%s]添加好友请求,已经自动通过!" %msg['RecommendInfo']['NickName'])
以上代码便可以实现 自动通过好友申请,并发一条打招呼的消息。
4、消息撤回监控
微信这个撤回消息让人有时比较头疼,尤其对强迫症患者来说。你说撤回就撤回吧,还TM的发个消息告诉我对方撤回了,我又不知道具体的内容,实在难受啊!不过有了这个itchat,便可以轻松实现一个撤回消息监控的功能。
思路很简单,监控所有好友发来的消息(这里只实现了文本、图片、语音消息)存储起来,当好友撤回时,根据撤回的消息ID查找我们保存的消息,提取其中内容来提示用户。对之前回复私聊的函数稍加改动。直接上代码:
# 检测来自私聊的文本类型、录音类型、图片类型的消息
@itchat.msg_register([TEXT, RECORDING, PICTURE], isFriendChat=True)
def reply_friend(msg):
#print(msg, flush=True)
global g_autoReplyFriend
if msg['Type'] == "Text": #文本消息,直接获取内容
msg_content = msg['Text']
elif msg['Type'] == "Recording" or msg['Type'] == "Picture": #录音和图片
msg_content = msg['FileName']
msg['Text'](str(msg_content)) #下载文件
if g_autoReplyFriend == True: #回复标记位 Ture 则自动回复
itchat.send_msg('[自动回复]: 你的消息已收到!', toUserName = msg['FromUserName'])
# 将信息存储在字典中,每一个msg_id对应一条信息
msg_information.update(
{
msg['MsgId']: {
"msg_type": msg["Type"],
"msg_content": msg_content,
}
}
)
if g_autoReplyFriend == True:
itchat.send_msg('[自动回复]: 你的消息已收到!', toUserName = msg['FromUserName'])
@itchat.msg_register([NOTE], isFriendChat=True)
def check_callback(msg):
global g_checkIfCallback
if g_checkIfCallback == True:
if '撤回了一条消息' in msg['Content']:
#在返回的content查找撤回的消息的id
old_msg_id = re.search("\<msgid\>(.*?)\<\/msgid\>", msg['Content']).group(1)
old_msg = msg_information.get(old_msg_id) #得到消息
old_msg_type = old_msg["msg_type"]
old_msg_content = old_msg['msg_content']
if old_msg_type == "Text":
msg_body = '%s,内容是[%s]' %(msg['Text'], old_msg_content)
#把消息发送给文件传输助手
itchat.send_msg(msg_body, toUserName='filehelper')
elif old_msg_type == "Recording" or old_msg_type == "Picture":
msg_body = '%s,内容是下面这个文件' %(msg['Text'])
itchat.send_msg(msg_body, toUserName='filehelper')
file = '@fil@%s' % (old_msg_content)
itchat.send(msg=file, toUserName='filehelper')
# 删除旧消息
msg_information.pop(old_msg_id)
最后主函数添加以下login函数实现登陆,run函数实现消息接收,便可以实现以上所有功能。
itchat.login(enableCmdQR=1)
itchat.run()
最后上效果图:
1、自动答复:
2、自动监控消息撤回
原创文章,转载请注明出处:
https://jerrycoding.com/article/wechat-tool-2
微信
支付宝